package com.poetry.common.util;

import cn.hutool.core.util.StrUtil;
import com.poetry.common.exception.ServiceException;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.PostConstruct;
import java.time.LocalDate;
import java.time.Period;
import java.util.Collection;
import java.util.Objects;
import java.util.function.Function;

/**
 * 通用攻击类
 * @author mengxj
 */
public final class CommonUtil {

    @PostConstruct
    private void s(){System.out.println(1231312);}

    /**
     * 将结果集放到模型视图内并返回
     * @param view 视图名
     * @param t 结果集
     * @param <T> 结果类型
     * @return modelAndView对象实例
     */
    public static <T> ModelAndView success(String view, T t){
        ModelAndView modelAndView = new ModelAndView(view);
        modelAndView.addObject("res", t);
        return modelAndView;
    }

    /**
     * 将double保留两位小数，去掉double后面多余的0，返回字符串
     * @param s 待操作的数据
     * @return 字符串
     */
    public static String trim0(Double s){
        String str = String.format("%.2f", s);
        if(str.contains(".")){
            str = str.replaceAll("0+?$", "");
            str = str.replaceAll("[.]$", "");
        }
        return str;
    }

    /**
     * 去掉double后面多余的0，返回字符串
     * @param s 待操作的数据
     * @return 处理好的结果
     */
    public static Double trim0AndReturn(Double s){
        return Double.parseDouble(trim0(s));
    }

    /**
     * 判断集合为空
     * @param list 待判断的集合
     * @return 结果
     */
    public static boolean isEmpty(Collection<?> list){
        return Objects.isNull(list) || list.isEmpty();
    }

    /**
     * 判断集合不为空
     * @param list 待判断的集合
     * @return 结果
     */
    public static boolean isNotEmpty(Collection<?> list){
        return !isEmpty(list);
    }

    /**
     * 将入参变成字符串，如果是空返回空串
     * @param t 入参
     * @param <T> 入参类型
     * @return 字符串
     */
    public static <T> String getString(T t){
        return Objects.isNull(t) ? StrUtil.EMPTY : t.toString();
    }

    /**
     * 将入参变成字符串，如果是空返回自定义字符串
     * @param t 入参
     * @param s 入参为空返回的自定义的字符串
     * @param <T> 入参类型
     * @return 字符串
     */
    public static <T> String getString(T t, String s){
        return Objects.isNull(t) ? s : t.toString();
    }

    /**
     * 获得两个日期之间的天数
     * @param start 开始时间
     * @param end 结束实间
     * @return 天数
     */
    public static Integer getDurDays(LocalDate start, LocalDate end){
        Period period = Period.between(start, end);
        int days = period.getDays();
        return days < 0 ? -days : days;
    }

    /**
     * 将字符串转成LocalDate对象
     * @param date 字符串，形如2020-08-09 或2020-8-9
     * @return LocalDate对象
     */
    public static LocalDate getLocalDate(String date){
        String[] dataArr = date.split("-");
        return LocalDate.of(Integer.parseInt(dataArr[0]), Integer.parseInt(dataArr[1]), Integer.parseInt(dataArr[2]));
    }

    /**
     * 根据自定义逻辑校验，符合直接抛出异常
     * @param fun 自定义逻辑校验
     * @param target 触发对象
     * @param msg 异常信息
     * @param <T> 触发对象类型
     */
    public static <T> void checkThrow(Function<T, Boolean> fun, T target, String msg){
        if(fun.apply(target)){
            throw new ServiceException(msg);
        }
    }
}
